/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo.persistencia;

import java.util.*;
import java.sql.*;
import modelo.IProveedor;
import modelo.Proveedor;
//import modelo.persistencia.IProveedorDAO;

/**
 *
 * @author Juanma
 */
public class ProveedorDAO implements IProveedorDAO{


    public void create(IProveedor proveedor) {
        try{

            Proveedor vacio=null;
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resvacio = stmt.executeQuery("SELECT count(*) FROM Proveedor");
            int numero=-1;
            if (resvacio.next()) {
                numero = resvacio.getInt("count(*)");
            }

            if(numero==0){
            String sql1 = "insert into proveedor(id,nombre,defecto) values (?,?,?)";
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql1);
            stm.setInt(1, proveedor.getIDProveedor());
            stm.setString(2, proveedor.getNombre());
            stm.setBoolean(3, true);
            stm.execute();
            }else{

            if(proveedor.getEsPorDefecto()){

            Proveedor c=null;
            //Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("SELECT * FROM Proveedor where defecto=true");
            String nombre;
            int id;
            boolean defecto;
            if (res.next()) {
                id = res.getInt("id");
                nombre = res.getString("nombre");
                defecto = res.getBoolean("defecto");
                c = new Proveedor(id, nombre, defecto);
            }

            c.setEsPorDefecto(false);

            String sql = "UPDATE proveedor SET defecto = ? where id = ?";

            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setBoolean(1, c.getEsPorDefecto());
            stm.setInt(2, c.getIDProveedor());

            stm.execute();

            String sql1 = "insert into proveedor(id,nombre,defecto) values (?,?,?)";
            PreparedStatement stm2 = Persistencia.createConnection().prepareStatement(sql1);
            stm2.setInt(1, proveedor.getIDProveedor());
            stm2.setString(2, proveedor.getNombre());
            stm2.setBoolean(3, proveedor.getEsPorDefecto());

            stm2.execute();

        }else{
        String sql = "insert into proveedor(id,nombre,defecto) values (?,?,?)";
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setInt(1, proveedor.getIDProveedor());
            stm.setString(2, proveedor.getNombre());
            stm.setBoolean(3, proveedor.getEsPorDefecto());

            stm.execute();
            }
            }
            }catch(Exception e){
            System.out.println("error: " + e.getMessage());
        }
    }

    public IProveedor read(int ID) {
        IProveedor c = null;
        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("SELECT * FROM Proveedor where id=" + ID);
            String nombre;
            int id;
            boolean defecto;
            if (res.next()) {
                id = res.getInt("id");
                nombre = res.getString("nombre");
                defecto = res.getBoolean("defecto");
                c = new Proveedor(id, nombre, defecto);
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return c;
    }

    public void update(IProveedor proveedor) {
        
        IProveedor p=null;
        try{
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("SELECT * FROM Proveedor where id=" + proveedor.getIDProveedor());
            String nombre;
            int id;
            boolean defecto;
            if (res.next()) {
                id = res.getInt("id");
                nombre = res.getString("nombre");
                defecto = res.getBoolean("defecto");
                p = new Proveedor(id, nombre, defecto);
            }
        }catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }

        if(!(p.getEsPorDefecto()==true && proveedor.getEsPorDefecto()==false)){
        if(proveedor.getEsPorDefecto()){
        Proveedor c=null;

         try{
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("SELECT * FROM Proveedor where defecto=true");
            String nombre;
            int id;
            boolean defecto;
            if (res.next()) {
                id = res.getInt("id");
                nombre = res.getString("nombre");
                defecto = res.getBoolean("defecto");
                c = new Proveedor(id, nombre, defecto);
            }

            c.setEsPorDefecto(false);

            String sql = "UPDATE proveedor SET defecto = ? where id = ?";

            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setBoolean(1, c.getEsPorDefecto());
            stm.setInt(2, c.getIDProveedor());

            stm.execute();

            sql = "UPDATE proveedor SET nombre = ?, defecto = ? where id = ?";

            PreparedStatement stm1 = Persistencia.createConnection().prepareStatement(sql);
            stm1.setString(1, proveedor.getNombre());
            stm1.setBoolean(2, proveedor.getEsPorDefecto());
            stm1.setInt(3, proveedor.getIDProveedor());

            stm1.execute();
         }catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        }else{
            String sql=null;
        if(proveedor.getNombre().equals("")==false){
          sql = "UPDATE proveedor SET nombre = ?,defecto = ? WHERE id = ?";

          try {
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setString(1, proveedor.getNombre());
            stm.setBoolean(2, proveedor.getEsPorDefecto());
            stm.setInt(3, proveedor.getIDProveedor());

            stm.execute();

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        }else{
          sql = "UPDATE proveedor SET defecto = ? WHERE id = ?";

          try {
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setBoolean(1, proveedor.getEsPorDefecto());
            stm.setInt(2, proveedor.getIDProveedor());

            stm.execute();

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        }
        }
        }
    }

    public void delete(IProveedor proveedor) {

        IProveedor p=null;
        try{
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("SELECT * FROM Proveedor where id=" + proveedor.getIDProveedor());
            String nombre;
            int id;
            boolean defecto;
            if (res.next()) {
                id = res.getInt("id");
                nombre = res.getString("nombre");
                defecto = res.getBoolean("defecto");
                p = new Proveedor(id, nombre, defecto);
            }
        }catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }

        if(p.getEsPorDefecto()==false){
        String sql = "DELETE FROM proveedor WHERE id = ?";
        try {
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sql);
            stm.setInt(1, proveedor.getIDProveedor());

            stm.execute();

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        }
    }

    public List<IProveedor> list() {
        List<IProveedor> proveedores = new ArrayList<IProveedor>();

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("SELECT * FROM Proveedor ");
            String nombre;
            int id;
            boolean defecto;
            while (res.next()) {

                id = res.getInt("id");
                nombre = res.getString("nombre");
                defecto = res.getBoolean("defecto");
                proveedores.add(new Proveedor(id, nombre, defecto));
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return proveedores;
    }

}
